package com.xuelianx.encryptlib;


import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;


/**
 * AES 是一种可逆加密算法，对用户的敏感信息加密处理 对原始数据进行AES加密后，在进行Base64编码转化；
 */
public class AESOperator {
    /*
     * 加密用的Key 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式，key需要为16位。
     */
	private static String sKey = "yitongjiayou2016";
    private static String ivParameter = "zeshanwl20160701";
    
    private AESOperator() {}
    
    public static String encrypt(String encData, String secretKey, String vector) throws Exception {
        if(secretKey == null) {
            return null;
        }
        if(secretKey.length() != 16) {
            return null;
        }
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        byte[] raw = secretKey.getBytes();
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        IvParameterSpec iv = new IvParameterSpec(vector.getBytes());// 使用CBC模式，需要一个向量iv，可增加加密算法的强度
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
        byte[] encrypted = cipher.doFinal(encData.getBytes("utf-8"));
        return Base64Utils.encodeToString(encrypted,0);// 此处使用BASE64做转码。
    }


    // 加密
    public static String encrypt(String sSrc){
    	try {
    		if(sSrc==null){
    			return null;
    		}
    		System.out.println("加密");
    		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    		byte[] raw = sKey.getBytes();
    		SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    		IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());// 使用CBC模式，需要一个向量iv，可增加加密算法的强度
    		cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
    		byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
    		return Base64Utils.encodeToString(encrypted,0).replace("+","%2B").replace("/","%2F").replace(" ","%20").replace("=","%3D");// 此处使用BASE64做转码。
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
    }


    public static String decrypt(String sSrc, String key, String ivs) throws Exception {
        try {
            byte[] raw = key.getBytes("ASCII");
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            IvParameterSpec iv = new IvParameterSpec(ivs.getBytes());
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
            byte[] encrypted1 =Base64Utils.decode(sSrc,0);// 先用base64解密
            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original, "utf-8");
            return originalString;
        } catch (Exception ex) {
        	ex.printStackTrace();
            return null;
        }
    }    
    
    // 解密
    public static String decrypt(String sSrc)  {
        try {
        	if(sSrc==null){
        		return null;
        	}
        	System.out.println("解密");
            byte[] raw = sKey.getBytes("ASCII");
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
            byte[] encrypted1 = Base64Utils.decode(sSrc,0);// 先用base64解密
            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original, "utf-8");
            return originalString;
        } catch (Exception ex) {
        	ex.printStackTrace();
            return null;
        }
    }


    public static String encodeBytes(byte[] bytes) {
        StringBuffer strBuf = new StringBuffer();
        for (int i = 0; i < bytes.length; i++) {
            strBuf.append((char) (((bytes[i] >> 4) & 0xF) + ((int) 'a')));
            strBuf.append((char) (((bytes[i]) & 0xF) + ((int) 'a')));
        }
        return strBuf.toString();
    }

    public static void main(String[] args) throws Exception {
        String DeString = AESOperator.decrypt("8xpUW8Ay8m10+Zux/vOMzg==");
        String Str01 = AESOperator.decrypt("duBJ7t3SRTeSSuzMp1ptnA==");
        String Str02 = AESOperator.decrypt("QCHd7fxXruO5EHL3n2dI3Q==");
        String Str03 = AESOperator.decrypt("");
        String Str04 = AESOperator.decrypt("");
        System.out.println("解密后的字串是：" + DeString);
        System.out.println("解密后的字串是：" + Str01);
        System.out.println("解密后的字串是：" + Str02);
        System.out.println("解密后的字串是：" + Str03);
        System.out.println("解密后的字串是：" + Str04);
        
    }
}
